package com.kotlin.library.ext

import android.view.View
import com.kotlin.library.data.protocol.BaseResp
import com.kotlin.library.rx.BaseFunc
import com.kotlin.library.rx.BaseFuncBoolean
import com.kotlin.library.rx.BaseSubscriber
import com.trello.rxlifecycle.LifecycleProvider
import rx.Observable
import rx.android.schedulers.AndroidSchedulers
import rx.schedulers.Schedulers

/**
 *
 * USER: zjw
 * DATA: 2018/11/27 0027
 * TIME: 下午 5:21
 * 基于kotlin的一个扩展函数 用于 把subscriber的线程调度和回调
 * 写法注意 首先写fun他是一个扩展方法,其次在那个类上,自定义方法,传入一个参数,下面是公共的东西
 * 需要把rxlifecycle引入
 */

/**
 * Obserable的事件结算的扩展
 * 参数1:一个Subscriber的实现类,不用每次都实现它的三个方法
 * 参数2:rxlifecycler的生命周期方法,注册,是从BasePresenter中引用过来的
 */
fun <T> Observable<T>.execut(baseSubscriber: BaseSubscriber<T>, lifecycleProvider: LifecycleProvider<*>) {
    this.subscribeOn(Schedulers.io())
        .observeOn(AndroidSchedulers.mainThread())
        .compose(lifecycleProvider.bindToLifecycle())
        .subscribe(baseSubscriber)
}

fun <T> Observable<BaseResp<T>>.convertBoolean(): Observable<Boolean> {
    return this.flatMap(BaseFuncBoolean())
}

fun <T> Observable<BaseResp<T>>.convert(): Observable<T> {
    return this.flatMap(BaseFunc())
}

/*
    扩展点击事件
 */
fun View.onClick(listener: View.OnClickListener): View {
    setOnClickListener(listener)
    return this
}

/*
    扩展点击事件，参数为方法
 */
fun View.onClick(method: () -> Unit): View {
    setOnClickListener { method() }
    return this
}
